]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
overview: Protect ::drag-end handlers
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 16 Nov 2017 16:27:12 +0000 (17:27 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 17 Nov 2017 13:34:40 +0000 (14:34 +0100)
These end up emitting item-drag-end/window-drag-end pretty much
without checks. Given the MetaDnd object may end up emitting
::drag-leave as a result of the plugin ending its grab, this
would result on spurious emission of those events and subsequent
warnings.

For extra paranoia, the _inDrag variable has been split into
_inItemDrag/_inWindowDrag so we can't cross the streams.

https://bugzilla.gnome.org/show_bug.cgi?id=784545

js/ui/overview.js

index 7eb2102dbedc50c5d901c1c6176094bc25d0d10b..816f32f5a669d77c08de6bf0a8bfa6bc8341a48c 100644 (file)
@@ -417,7 +417,7 @@ var Overview = new Lang.Class({
 
     beginItemDrag: function(source) {
         this.emit('item-drag-begin');
-        this._inDrag = true;
+        this._inItemDrag = true;
     },
 
     cancelledItemDrag: function(source) {
@@ -425,13 +425,15 @@ var Overview = new Lang.Class({
     },
 
     endItemDrag: function(source) {
+        if (!this._inItemDrag)
+            return;
         this.emit('item-drag-end');
-        this._inDrag = false;
+        this._inItemDrag = false;
     },
 
     beginWindowDrag: function(window) {
         this.emit('window-drag-begin', window);
-        this._inDrag = true;
+        this._inWindowDrag = true;
     },
 
     cancelledWindowDrag: function(window) {
@@ -439,8 +441,10 @@ var Overview = new Lang.Class({
     },
 
     endWindowDrag: function(window) {
+        if (!this._inWindowDrag)
+            return;
         this.emit('window-drag-end', window);
-        this._inDrag = false;
+        this._inWindowDrag = false;
     },
 
     focusSearch: function() {
@@ -484,7 +488,7 @@ var Overview = new Lang.Class({
     shouldToggleByCornerOrButton: function() {
         if (this.animationInProgress)
             return false;
-        if (this._inDrag)
+        if (this._inItemDrag || this._inWindowDrag)
             return false;
         if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT)
             return true;